查看原文
其他

标准化 Keras:TensorFlow 2.0 高级 API 指南

Google TensorFlow 2019-02-14

文 / Sandeep Gupta、Josh Gordon 和 Karmel Allison 代表 TensorFlow 团队发布


TensorFlow 正准备发布 2.0 版。本文中,我们将会预览 TensorFlow 高级 API 的发展方向,并解答一些常见问题。


Keras 是一个颇受欢迎的高级 API,专用于构建和训练深度学习模型。此 API 可用于快速原型设计、顶尖研究与实际生产。TensorFlow 现已支持 Keras,但在 2.0 版中,我们正致力将 Keras 更紧密地集成至 TensorFlow 平台的其余组件。


通过将 Keras 打造为 TensorFlow 的高级 API,我们旨在帮助机器学习新手开发者们更轻松地开启 TensorFlow 入门之旅。单个高级 API 可减少混淆,使我们更加专注于为研究人员提供高级功能。


我们希望您能像我们一样,尽情享受此款 API 的使用体验!


Keras 具备以下几项关键优势:

  • 人性化:Keras 界面简单、一致,已针对常见用例进行优化。Keras 能够就用户错误提供清晰且可处理的反馈,不仅便于用户了解错误消息,而且通常还能提供实用建议。

  • 模块化与可组合性:Keras 模型由可配置的构建基块相连组合而成,几乎不存在任何限制。Keras 的部分组件可重复利用,用户将无需采用甚至了解框架提供的全部内容。例如,您无需通过 Keras 模型开展训练便可使用层或优化器。

  • 易于扩展:您可以通过编写自定义构建基块来展现新的研究思路,包括构建新层、损失函数以及 [在此处插入您的想法] 以开发顶尖创意。

  • 初学者和专家通用:深度学习开发者背景不同、经验水平各异,而无论您是刚刚入门,还是拥有多年经验,Keras 均可提供切合您需求的 API。


综上所述,无论是学习机器学习、研究、应用开发抑或部署,Keras 均能在各类用例中简化工作流程并提高工作效率。


首先,我们会解答现已提出的几个问题。其次,我们将深入了解 TensorFlow 随附的此版 Keras 将能为您实现哪些功能。



常见问题解答

Keras 是否为一个独立的库?

其实,更应将 Keras 视为一种 API 规范。Keras 的参考实现一直作为独立的开放源代码项目进行维护,具体可于此网站找到:www.keras.io。该项目独立于 TensorFlow,并拥有一个活跃的贡献者与用户社区。TensorFlow 包括 Keras API 的完整实现(位于 tf.keras 模块),且此 API 具备针对 TensorFlow 的增强功能。


Keras 只是 TensorFlow 或其他库的包装器吗?

不,这是一个常见误解(但可以理解)。Keras 是一种用于定义和训练机器学习模型的 API 标准。Keras 与特定实现无关:Keras API 可用于 TensorFlow、MXNet、TypeScript、JavaScript、CNTK、Theano、PlaidML、Scala、CoreML 和其他库的实现。


TensorFlow 内置的 Keras 版本与 keras.io 提供的版本有何不同?

TensorFlow 包括 Keras API 的具体实现(位于 tf.keras 模块),且此 API 具备针对 TensorFlow 的增强功能。这些功能包括:支持 Eager Execution 以便进行直观调试和快速迭代、支持 TensorFlow SavedModel 模型交换格式,以及为分布式训练(包括 TPU 上的训练)提供集成支持。


在使用 tf.keras Model Subclassing API 时,Eager Execution 功能尤为有用。此 API 是受 Chainer 的启发开发而成,可让您命令式地编写模型的正向传递。tf.keras 紧密集成于 TensorFlow 生态系统,同时也支持:

  • tf.data:可助您构建高性能输入管道。若您有意尝试,则可使用 NumPy 格式的数据训练模型,或使用 tf.data 来扩大规模和提升性能。

  • 分布策略:该策略用于在各类计算配置中开展分布式训练,包括遍布于众多机器上的 GPU 和 TPU。

  • 导出模型:利用 tf.keras API 创建的模型能够以 TensorFlow SavedModel 格式进行序列化,并能借助 TensorFlow Serving 或通过其他语言绑定(Java、Go、Rust、C# 等)提供给用户使用。

  • 导出的模型可通过 TensorFlow Lite 部署至移动和嵌入式设备,同时也适用于 TensorFlow.js(注意:您也可使用同样常见的 Keras API 直接在 JavaScript 中开发模型)。

  • 特征列:用于有效表示及分类结构化数据。

  • 此外,tf.keras 还可支持其他正在开发的内容。



如何安装 tf.keras?是否还需通过 pip 安装 Keras?

tf.keras 内附于 TensorFlow 中。您无需单独安装 Keras。例如,您可以在 Colab 笔记本中运行如下代码:

!pip install tensorflow
import tensorflow as tf
Dense = tf.keras.layers.Dense


现在您已能使用 tf.keras。如果您不熟悉如何导入,可以查看近期发布的部分 教程 获取示例(https://www.tensorflow.org/tutorials/)


您提到 TensorFlow 可为初学者和专家提供不同的 API 模式。这些模式看起来如何?


TensorFlow 开发者的经验水平千差万别,既有首次学习机器学习的学生,也有机器学习专家和研究人员。恰巧,TensorFlow 的优点之一便是能提供多个 API 以支持不同的工作流程和目标。而这也是 TensorFlow 集成 Keras 的主要设计目标,即让用户能够选择对自己更有用处的 Keras 组件,而无需采用整个框架。



Sequential API

如果您正在学习机器学习,建议您先从 tf.keras Sequential API 开始。该款 API 直观、简洁,且适用于实践中 95% 的机器学习问题。如果使用此 API,您大约只需 10 行代码便可编写出首个神经网络。


通过几行代码训练首个神经网络的示例(https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/tutorials/_index.ipynb)


最常见的模型定义方法是构建层图,这与我们在深度学习中通常使用的心智模式相对应。最简单的模型类型是层堆栈。您可以使用 Sequential API 定义此类模型,如下所示:

model = tf.keras.Sequential()
model.add(layers.Dense(64, activation=’relu’))
model.add(layers.Dense(64, activation=’relu’))
model.add(layers.Dense(10, activation=’softmax’))
Such a model can then be compiled and trained in a few lines:
model.compile(optimizer=’adam’,
             loss=’sparse_categorical_crossentropy’,
             metrics=[‘accuracy’])model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)

您可以在 “学习和使用机器学习” 部分找到更多使用 Sequential API 的示例,(参考链接:tensorflow.org/tutorials)。


获取教程,了解如何使用 Sequential API 在 Fashion MNIST 数据集上训练首个神经网络(https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/tutorials/keras/basic_classification.ipynb) 



Functional API

当然,序贯模型只是简单的层堆栈,并不能表示任意模型。您可使用 Functional API 构建更高级的模型,此 API 可帮助您定义复杂的拓扑结构,包括多输入和多输出模型、共享层模型以及采用残差连接的模型。


使用 Functional API 构建模型时,层可供调用(在张量上),还可返回张量以作为输出。这些输入和输出张量可用于定义模型。例如:

inputs = tf.keras.Input(shape=(32,))
# A layer instance is callable on a tensor, and returns a tensor.
x = layers.Dense(64, activation=’relu’)(inputs)
x = layers.Dense(64, activation=’relu’)(x)
predictions = layers.Dense(10, activation=’softmax’)(x)
# Instantiate the model given inputs and outputs.
model = tf.keras.Model(inputs=inputs, outputs=predictions)


此类模型也可使用以上同种简单命令进行编译和训练。您可在 此处 (https://www.tensorflow.org/guide/keras#functional_api)了解有关 Functional API 的更多内容。



Model Subclassing API

可使用 Model Subclassing API 构建可完全自定义的模型。在类方法主体中,您可采用此模式命令式地定义正向传递。例如:

class MyModel(tf.keras.Model):


def __init__(self):
  super(MyModel, self).__init__()
  # Define your layers here.
  self.dense_1 = layers.Dense(32, activation=’relu’)
  self.dense_2 = layers.Dense(num_classes, activation=’sigmoid’) 


def call(self, inputs):
  # Define your forward pass here,
  # using layers you previously defined in `__init__`
  x = self.dense_1(inputs)
  return self.dense_2(x)

此类模型更加灵活,但也更难调试。这三类模型均可使用简单的编译与调整命令(如前文所示)进行编译和训练,您也可自行编写自定义训练循环,以实现完全控制。


例如:

model = MyModel()


with tf.GradientTape() as tape:
 logits = model(images, training=True)
 loss_value = loss(logits, labels)


grads = tape.gradient(loss_value, model.variables)
optimizer.apply_gradients(zip(grads, model.variables))


如需 Model Subclassing 模式的更多相关示例,请查看下方链接或访问 tensorflow.org/tutorials(参阅 “研究与实验” 部分)。


通过 Model Subclassing API 实现的基于注意力机制的神经机器翻译

通过 Model Subclassing API 实现的 GAN(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/eager/python/examples/generative_examples/dcgan.ipynb)



如果以上三种模式均不适用我的研究,该怎么办?

如果您发现 tf.keras 不适用于自身应用领域,我们还提供其他多种途径。您可以:

  • 单独使用 Keras 模型定义中的 tf.keras.layers,然后自行编写梯度和训练代码。您还可单独或独立使用 tf.keras.optimizers、tf.keras.initializers、tf.keras.losses 或 tf.keras.metrics。

  • 此外,您也可完全忽略 tf.keras,并使用较低层级的 TensorFlow、Python 和 AutoGraph 获取您期望的结果。


这完全由您决定!请注意,tf.layers 中的非面向对象层将被弃用,且 tf.contrib.*(包括 tf.contrib.slim 和 tf.contrib.learn 等高级 API)将无法在 TensorFlow 2.0 中使用。



Estimator 有何变化?

Estimator 在 Google 内部以及更广泛的 TensorFlow 社区中应用甚广。我们已将数种模型打包为预创建的 Estimator,包括线性分类器、DNN 分类器、DNN 线性组合分类器(亦即广度与深度模型)和梯度提升树。这些模型已投入生产并得到广泛部署;基于此,TensorFlow 2.0 中将会添加 Estimator API(包括预创建的 Estimator)。


对于使用预创建 Estimator 的用户而言,新版中重点开发的 Keras 和 Eager Execution 对其产生的影响微乎其微。我们可以更改预创建 Estimator 的实现方式,但会保持 API 界面不变。我们还将继续添加作为预创建 Estimator 实现的模型的 Keras 版本,同时还会扩展 Keras,以更好地满足大规模生产需求。


换言之,如果您在开发自定义架构,我们建议您使用 tf.keras 而非 Estimator 来构建模型。如果您在构建需要借助 Estimator 的基础架构,则可通过 model_to_estimator() 来转换模型,而我们会努力确保 Keras 在整个 TensorFlow 生态系统中顺利运行。



向 TensorFlow 2.0 进军!

我们希望您能像我们一样,尽情享受 tf.keras 的使用体验!未来数月内,TensorFlow 团队将专注提升开发者的使用体验。在此期间,我们会提供相关文档和教程。我们期待您分享看法和反馈,并通过 GitHub Issue 和 PR 为项目作出贡献。感谢大家!



更多 AI 相关阅读:




    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存